home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / initramfs-tools / scripts / local < prev    next >
Text File  |  2009-05-07  |  5KB  |  194 lines

  1. # Local filesystem mounting            -*- shell-script -*-
  2.  
  3. # Parameter: device node to check
  4. # Echos fstype to stdout
  5. # Return value: indicates if an fs could be recognized
  6. get_fstype ()
  7. {
  8.     local FS FSTYPE FSSIZE RET
  9.     FS="${1}"
  10.  
  11.     # blkid has a more complete list of file systems,
  12.     # but fstype is more robust
  13.     eval $(fstype "${FS}" 2> /dev/null)
  14.  
  15.     if [ -z "${FSTYPE}" ]; then
  16.         FSTYPE="unknown"
  17.     fi
  18.  
  19.     if [ "$FSTYPE" = "unknown" ] && [ -x /sbin/blkid ]; then
  20.         FSTYPE=$(/sbin/blkid -s TYPE -o value "${FS}" 2> /dev/null)
  21.     fi
  22.     RET=$?
  23.  
  24.     if [ -z "${FSTYPE}" ]; then
  25.         FSTYPE="unknown"
  26.     fi
  27.  
  28.     echo "${FSTYPE}"
  29.     return ${RET}
  30. }
  31.  
  32. root_missing()
  33. {
  34.     ROOT="${1}"
  35.     [ ! -e "${ROOT}" ] || ! $(get_fstype "${ROOT}" >/dev/null) || ! /sbin/udevadm settle
  36. }
  37.  
  38. # Parameter: Where to mount the filesystem
  39. mountroot ()
  40. {
  41.     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
  42.     run_scripts /scripts/local-top
  43.     [ "$quiet" != "y" ] && log_end_msg
  44.  
  45.     # If the root device hasn't shown up yet, give it a little while
  46.     # to deal with removable devices
  47.     while root_missing "${ROOT}"; do
  48.         log_begin_msg "Waiting for root file system..."
  49.  
  50.         # Default delay is 30s
  51.         if [ -z "${ROOTDELAY}" ]; then
  52.             slumber=30
  53.         else
  54.             slumber=${ROOTDELAY}
  55.         fi
  56.         if [ -x /sbin/usplash_write ]; then
  57.             /sbin/usplash_write "TIMEOUT ${slumber}" || true
  58.         fi
  59.  
  60.         slumber=$(( ${slumber} * 10 ))
  61.         while root_missing "${ROOT}"; do
  62.             /bin/sleep 0.1
  63.             slumber=$(( ${slumber} - 1 ))
  64.             [ ${slumber} -gt 0 ] || break
  65.         done
  66.  
  67.         if [ ${slumber} -gt 0 ]; then
  68.             log_end_msg 0
  69.         else
  70.             log_end_msg 1 || true
  71.         fi
  72.         if [ -x /sbin/usplash_write ]; then
  73.             /sbin/usplash_write "TIMEOUT 15" || true
  74.         fi
  75.  
  76.         # Run failure hooks, hoping one of them can fix up the system
  77.         # and we can restart the wait loop.  If they all fail, abort
  78.         # and move on to the panic handler and shell.
  79.         if root_missing "${ROOT}" && ! try_failure_hooks; then
  80.             break
  81.         fi
  82.     done
  83.  
  84.     # We've given up, but we'll let the user fix matters if they can
  85.     while root_missing "${ROOT}"; do
  86.         # give hint about renamed root
  87.         case "${ROOT}" in 
  88.         /dev/hd*)
  89.             suffix="${ROOT#/dev/hd}"
  90.             major="${suffix%[[:digit:]]}"
  91.             major="${major%[[:digit:]]}"
  92.             if [ -d "/sys/block/sd${major}" ]; then
  93.                 echo "WARNING bootdevice may be renamed. Try root=/dev/sd${suffix}"
  94.             fi
  95.             ;;
  96.         /dev/sd*)
  97.             suffix="${ROOT#/dev/sd}"
  98.             major="${suffix%[[:digit:]]}"
  99.             major="${major%[[:digit:]]}"
  100.             if [ -d "/sys/block/hd${major}" ]; then
  101.                 echo "WARNING bootdevice may be renamed. Try root=/dev/hd${suffix}"
  102.             fi
  103.             ;;
  104.         esac
  105.         echo "Gave up waiting for root device.  Common problems:"
  106.         echo " - Boot args (cat /proc/cmdline)"
  107.         echo "   - Check rootdelay= (did the system wait long enough?)"
  108.         echo "   - Check root= (did the system wait for the right device?)"
  109.         echo " - Missing modules (cat /proc/modules; ls /dev)"
  110.         panic "ALERT!  ${ROOT} does not exist.  Dropping to a shell!"
  111.     done
  112.  
  113.     # Get the root filesystem type if not set
  114.     if [ -z "${ROOTFSTYPE}" ]; then
  115.         FSTYPE=$(get_fstype "${ROOT}")
  116.     else
  117.         FSTYPE=${ROOTFSTYPE}
  118.     fi
  119.  
  120.     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
  121.     run_scripts /scripts/local-premount
  122.     [ "$quiet" != "y" ] && log_end_msg
  123.  
  124.     if [ ${readonly} = y ] && \
  125.        [ -z "$LOOP" ]; then
  126.         roflag=-r
  127.     else
  128.         roflag=-w
  129.     fi
  130.  
  131.     # FIXME This has no error checking
  132.     modprobe ${FSTYPE}
  133.  
  134.     # FIXME This has no error checking
  135.     # Mount root
  136.     mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
  137.     mountroot_status="$?"
  138.     if [ "$LOOP" ]; then
  139.         if [ "$mountroot_status" != 0 ]; then
  140.             if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
  141.                 panic "
  142. Could not mount the partition ${ROOT}.
  143. This could also happen if the file system is not clean because of an operating
  144. system crash, an interrupted boot process, an improper shutdown, or unplugging
  145. of a removable device without first unmounting or ejecting it.  To fix this,
  146. simply reboot into Windows, let it fully start, log in, run 'chkdsk /r', then
  147. gracefully shut down and reboot back into Windows. After this you should be
  148. able to reboot again and resume the installation.
  149. (filesystem = ${FSTYPE}, error code = $mountroot_status)
  150. "
  151.             fi
  152.         fi
  153.     
  154.         mkdir -p /host
  155.         mount -o move ${rootmnt} /host
  156.  
  157.         while [ ! -e "/host/${LOOP#/}" ]; do
  158.             panic "ALERT!  /host/${LOOP#/} does not exist.  Dropping to a shell!"
  159.         done
  160.  
  161.         # Get the loop filesystem type if not set
  162.         if [ -z "${LOOPFSTYPE}" ]; then
  163.             eval $(fstype < "/host/${LOOP#/}")
  164.         else
  165.             FSTYPE="${LOOPFSTYPE}"
  166.         fi
  167.         if [ "$FSTYPE" = "unknown" ] && [ -x /sbin/blkid ]; then
  168.             FSTYPE=$(/sbin/blkid -s TYPE -o value "/host/${LOOP#/}")
  169.             [ -z "$FSTYPE" ] && FSTYPE="unknown"
  170.         fi
  171.  
  172.         if [ ${readonly} = y ]; then
  173.             roflag=-r
  174.         else
  175.             roflag=-w
  176.         fi
  177.  
  178.         # FIXME This has no error checking
  179.         modprobe loop
  180.         modprobe ${FSTYPE}
  181.  
  182.         # FIXME This has no error checking
  183.         mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "/host/${LOOP#/}" ${rootmnt}
  184.  
  185.         if [ -d ${rootmnt}/host ]; then
  186.             mount -o move /host ${rootmnt}/host
  187.         fi
  188.     fi
  189.  
  190.     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
  191.     run_scripts /scripts/local-bottom
  192.     [ "$quiet" != "y" ] && log_end_msg
  193. }
  194.